interface IPerson {
    readonly icard?: number;
    name: string;
    age: number;
    sex?: string; ////可选属性  可以可无,
    isStudent?: boolean;
    enteryTime?: null | string;
    study?: IPerson[];
    sayhi?: (num1: number, uname: string) => string

    [propName: string]:
        | string
        | boolean
        | number
        | undefined
        | null
        | IPerson[]
        | Function;

    //任意属性
    //   需要注意的是，一旦定义了任意属性，那么确定属性和可选属性的类型都必须是它的类型的子集：
    // 即对象中所有的确定属性和可选属性 存在于任意属性中

    //   一个接口中只能定义一个任意属性。如果接口中有多个类型的属性，则可以在任意属性中使用联合类型：
    //   [propName: string]: any; //任意属性
}

type a = IPerson['age'] //方括号运算符可以取出 interface 某个属性的类型。
let personZ: IPerson = {
    icard: 2122107,
    name: "张可顺",
    age: 18,
    // sex:'男' ,
    isStudent: false,
    enteryTime: "2023-6-19",
    study: [{name: "张可顺", age: 18}],
    address: "徐州",
    sayhi: () => {
        return 'sda'
    }
};
// personZ.sayhi(4, "张可顺");
// personZ.icard = 5;//报错了 只读类型不能修改
//
let fruits: {
    name: string;
    price: number;
} = {
    name: "apple",
    price: 100,
};

// ^ 对象类型的索引签名  用来约束对象的属性类型

interface IPerson2 {
    age: string;

    [index: string]: string;
}

const das: IPerson2 = {age: "18"};

interface StringArray {
    [index: number]: number;
}

const dfdf: StringArray = [23];
console.log(dfdf[0]);
